home *** CD-ROM | disk | FTP | other *** search
/ MacTech 1 to 12 / MacTech-vol-1-12.toast / Source / MacTech® Magazine / Volume 09 - 1993 / 09.10 Oct 93 / THINK Top 10 / generic JGNE.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-09-07  |  3.3 KB  |  103 lines  |  [TEXT/KAHL]

  1. // generic JGNE.c, by Kevin Irlen, Symantec Corp. 7/93
  2.  
  3. /*
  4.  Add this file to a project of type Code Resource.  Set Type to CODE, ID to 128,
  5.  and check the "Locked" and "System Heap" attributes. Optionally, set Creator to RSED 
  6.  and File Type to rsrc so you can open this with ResEdit. Add this file.
  7.  
  8.  When building the resource, "Merge" it into your INIT, or into your manual install 
  9.  project's resource file.
  10. */
  11.  
  12. short myJGNEFilterFunc(short hasEvent,const EventRecord *anEvent);
  13.  
  14. /*
  15.  The generic JGNE INIT code expects main (i.e. the main entry point in
  16.  the code resource) to be exactly as follows. It relies on knowing the
  17.  the exact location of the dummy movea.l instruction, which it must overwrite.
  18. */
  19.  
  20. // This generic JGNE does the SetupA4 stuff necessary so you can use statics
  21. // or globals, if desired.
  22.  
  23. main()
  24.  asm
  25.  {
  26.   move.l   A1   ,-(SP)       ; A1    holds theEvent
  27.   move.w   8(SP),-(SP)       ; 8(SP) holds hasEvent (4(SP) + 4 we just pushed)
  28.   jsr      myJGNEFilterFunc
  29.   move.w   D0,10(SP)         ; put return value back at what will be 4(SP)
  30.   addq.l   #2,SP             ; pop hasEvent                    (10 - 2 = 8)
  31.   move.l   (SP)+,A1          ; pop theEvent back into A1       ( 8 - 4 = 4)
  32.   movea.l  #0xFFFFFFFF,A0    ; this gets overwritten at INIT time with either the
  33.   jmp      (A0)              ; next JGNE's address, or an RTS if there isn't one!
  34.  }
  35. }
  36.  
  37. #include <SetUpA4.h>                  // DO NOT move this before main! (It generates code.)
  38.  
  39.                                       
  40. short myJGNEFilterFunc(short hasEvent,const EventRecord *theEvent)
  41.  char theChar;
  42.  
  43.  RememberA0(); SetUpA4();
  44.  
  45.  if (hasEvent)
  46.  {
  47.   switch (theEvent->what) 
  48.   {
  49.    // Handle your events here.  Set hasEvent to 0 if you don't want the event
  50.    // you handled to be passed to the next JGNE or the current application.
  51.    // This code beeps any time the user types cmd-shift j, g, n, or e!
  52.  
  53.    case keyDown:
  54.    case autoKey: 
  55.  
  56.    theChar = theEvent->message & charCodeMask;
  57.  
  58.    if ((theEvent->modifiers & cmdKey) && (theEvent->modifiers & shiftKey)) 
  59.     if ((theChar == 'j') || (theChar == 'g') || (theChar == 'n') || (theChar == 'e')) 
  60.      {
  61.       SysBeep(10);
  62.       
  63.        hasEvent = 0;
  64.       }
  65.       
  66.    default:
  67.     break;
  68.   }
  69.  } 
  70.  RestoreA4();
  71.  
  72.  return hasEvent;
  73. }
  74.  
  75. /*
  76.  
  77. NOTE:
  78.  
  79. If you install the above jGNE and attempt to make use of it when a DA is the
  80. front window, you'll be in for a nasty surprise.  It won't work!  For some
  81. reason beyond my comprehension, DA's do not send keyDown events through
  82. GetNextEvent in the documented way; specifically, hasEvent does not get set.  
  83.  
  84. The simple solution is:
  85.  
  86. Remove the test for hasEvent, and just go straight to examining the event
  87. record, which will contain the proper information (and *should* be empty if
  88. there's no event).  
  89.  
  90. In fact, there doesn't seem to be much reason to have the test for hasEvent at
  91. all, other than to bypass the switch statement, and possibly to allow you to
  92. try to steal events from other jGNE's that happen to be loaded after yours (not
  93. a very sensible thing to try to do).  I've left it in, mostly for form's sake,
  94. and in hopes that the problem might motivate someone to find an answer to the
  95. DA mystery!  On the other hand, you might even take it out of the call to the
  96. filter function altogether, remove it from the assembly in main, change the
  97. offset it the installer program, etc....
  98.   
  99. */
  100.  
  101.